package top.seefly.javase.jvm;

import org.junit.Test;

/**
 * 茴香豆的茴有几种写法？
 * new String("xx")创建了几个对象啊？
 * @author liujianxin
 * @date 2021/4/9 14:20
 */
public class StringQuestion {
    
    /**
     * 变量拼装,使用StringBuilder()
     */
    public void testA(){
        // a 放到字节码文件的常量池中
        String a = "a";
        // b 放到字节码文件的常量池中
        String b = "b";
        // 调用字节码指令拼装，简化一下相当于 ab =  new String(new StringBuilder().append(a).append(b).toString());
        String ab = a + b;
        // 跟上面差不多，也是用StringBuilder
        String cd = "a" + ab;
    }
    
    /**
     * 字面量拼接，编译器会优化
     */
    @Test
    public void testB(){
        String a = "ab";
        // 编译后就相当于 b = "ab"
        String b = "a"+"b";
        // true
        System.out.println(a == b);
        
    }
    
    
    /**
     * intern方法，将字符串放入串池，并返回串池中的引用
     * 1、如果串池中有，则直接返回串池中的引用
     * 2、如果串池中没有，则把当前字符串放进去，再返回串池中的引用
     *
     */
    @Test
    public void testC(){
        // 动态拼接，在堆中，此时["a","b"]
        String b = new String("a") + new String("b");
        
        // 如果开启这一行，最后打印false。否则打印true
        // 因为intern方法发现串池中已经有了，所以b本身没有移动到串池中
        // String a = "ab";
        
        // 串池没有，["a","b","ab"]，放进去
        b.intern();

        // true,b本身的地址改变了
        System.out.println(b == "ab");
    }
    
    
    /**
     * 面试题
     * false
     * true
     * true
     * false
     */
    @Test
    public void testMianshi(){
        String s1 = "a";
        String s2 = "b";
        String s3 = "a"+"b";
        String s4 = s1 + s2;
        String s5 = "ab";
        String s6 = s4.intern();
    
        System.out.println(s3 == s4);
        System.out.println(s3 == s5);
        System.out.println(s3 == s6);
        
        String x2 = new String("c") + new String("d");
        String x1 = "cd";
        x2.intern();
    
        System.out.println(x1 == x2);
        
        Object a = new Object();
        a.toString();
    }
    
    
}
